package alp.starcode.ebagtestdata;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.AES;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.github.yulichang.base.MPJBaseService;
import com.github.yulichang.base.MPJBaseServiceImpl;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * mybaits-plus代码构建
 *
 * @author liwang
 * @date 2021年11月17日18:01:27
 */
public class MyBatisPlusEntityGenerate {

    static final String OUT_PATH = System.getProperty("user.dir");
    static final String MODULE_NAME = "sanping-info-service-framework";
    static final String DATABASES_PATH = "127.0.0.1:3306"; //NOSONAR 仅特例，用于代码生成
    static final String DATABASES_NAME = "sanping_service_db";
    public static final String USER_NAME = "root";
    public static final String USER_PSW = "123456";
    public static final String DATABASE_URL = "jdbc:mysql://" + DATABASES_PATH + "/" + DATABASES_NAME + "?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC";
    //最顶级包名,生成的所有的顶级包名
    public static final String PARENT_PACKAGE = "alp.starcode.sanping.framework.database.mariadb.mybatis";


    public static void main(String[] args) {
        // 生成器
        AutoGenerator mpg = new AutoGenerator();
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(null).setController(null);
        mpg.setTemplate(templateConfig);
        // 包配置
        mpg.setPackageInfo(packageConfig());
        // 全局配置
        mpg.setGlobalConfig(globalConfig());
        // 数据源配置
        mpg.setDataSource(dataSource());
        // 策略配置
        mpg.setStrategy(strategy());
        // 执行生成
        mpg.execute();
    }

    @Test
    public void generateRandomKey() {
        String randomKey = AES.generateRandomKey();
        System.out.println("数据库连接秘钥,请妥善保存:" + randomKey); //NOSONAR 仅特例，用于代码生成
        String url = AES.encrypt(DATABASE_URL, randomKey);
        String uname = AES.encrypt(USER_NAME, randomKey);
        String pwd = AES.encrypt(USER_PSW, randomKey);
        System.out.println("数据库连接地址\t mpw:" + url); //NOSONAR 仅特例，用于代码生成
        System.out.println("数据库用户名  \t mpw:" + uname); //NOSONAR 仅特例，用于代码生成
        System.out.println("数据库用户密码\t mpw:" + pwd); //NOSONAR 仅特例，用于代码生成
    }

    /**
     * 数据源配置
     */
    private static DataSourceConfig dataSource() {
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);  // mysql生成用DbType.MYSQL
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername(USER_NAME);
        dsc.setPassword(USER_PSW);
        dsc.setUrl(DATABASE_URL);
        return dsc;
    }

    /**
     * 包名配置
     */
    private static PackageConfig packageConfig() {
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent(PARENT_PACKAGE);   // 父包名
        pc.setService(SERVICE_PACKAGE);           // Service包名
        pc.setServiceImpl(SERVICE_IMPL_PACKAGE);  // Service Impl包名
        pc.setMapper(MAPPER_PACKAGE);             // Mapper包名
        pc.setEntity(ENTITY_PACKAGE);             // Entity包名
        return pc;
    }

    /**
     * 全局配置
     */
    private static GlobalConfig globalConfig() {
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setIdType(IdType.INPUT);
        gc.setOpen(false);
        gc.setSwagger2(SWAGGER_ENABLE);         // 开启swagger2模式
        gc.setOutputDir(OUT_PATH + "\\" + MODULE_NAME + "\\src\\main\\java");  // 生成文件存放的位置
        gc.setFileOverride(RECOVER_ENABLE);     // 是否覆盖已有文件
        gc.setActiveRecord(false);    // 开启ActiveRecord模式,默认false
        gc.setEnableCache(false);     // 是否在xml中添加二级缓存配置,默认false
        gc.setBaseResultMap(true);    // 开启BaseResultMap(通用查询映射结果)
        gc.setBaseColumnList(true);   // 开启baseColumnList(通用查询结果列)
        gc.setAuthor("Clxini");          // 开发人员
        // 自定义文件命名，注意 %s 会自动填充表实体属性(各层文件名称方式，例如：%sAction生成UserAction, %s为占位符)
        gc.setServiceName("%sDao");// service 命名方式
        gc.setServiceImplName("%sDaoImpl");// service impl 命名方式
        gc.setMapperName("%sMapper");
        return gc;
    }

    /**
     * 策略配置
     */
    private static StrategyConfig strategy() {
        StrategyConfig strategy = new StrategyConfig();
        strategy.setLogicDeleteFieldName("delete_flag");
        strategy.setTablePrefix(""); // 去掉表名前缀
        strategy.setNaming(NamingStrategy.underline_to_camel); // 表名生成策略(underline_to_camel：下划线转驼峰命名)
        strategy.setExclude("interface_info","sys_dict_data","sys_dict_type","log_operate","log_operate_desc","log_user_login");
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setSuperControllerClass("alp.starcode.mcsu.framework.base.BaseController");// 自定义继承的Controller类全称，带包名
        strategy.setEntityLombokModel(true);    // 实体类是否为lombok模型(默认false)
        strategy.setSuperMapperClass("com.github.yulichang.base.MPJBaseMapper");
        strategy.setSuperServiceClass(MPJBaseService.class);
        strategy.setSuperServiceImplClass(MPJBaseServiceImpl.class);
        strategy.setChainModel(true); //生成build代码
        List<TableFill> tableFills = new ArrayList<>();
        tableFills.add(new TableFill("create_user_id", FieldFill.INSERT));
        tableFills.add(new TableFill("create_user_name", FieldFill.INSERT));
        tableFills.add(new TableFill("create_time", FieldFill.INSERT));
        tableFills.add(new TableFill("update_user_id", FieldFill.INSERT_UPDATE));
        tableFills.add(new TableFill("update_user_name", FieldFill.INSERT_UPDATE));
        tableFills.add(new TableFill("update_time", FieldFill.INSERT_UPDATE));
        strategy.setTableFillList(tableFills);
        return strategy;
    }


    //===================不需要修改配置=====================//
    // 开启swagger2模式
    public static final Boolean SWAGGER_ENABLE = false;
    // 是否覆盖已有文件
    public static final Boolean RECOVER_ENABLE = true;
    //dao包名
    public static final String SERVICE_PACKAGE = "dao";
    //service.iml包名
    public static final String SERVICE_IMPL_PACKAGE = "dao.impl";
    //mapper包名
    public static final String MAPPER_PACKAGE = "mapper";
    //entity包名
    public static final String ENTITY_PACKAGE = "entity";

}


